package br.com.werp.regras.pessoa;

import br.com.werp.regras.geral.Debuger;
import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.GerenciadorErros;
import br.com.werp.regras.geral.GerenciamentoPessoa;
import br.com.werp.regras.geral.helpers.PessoaHelper;
import br.com.werp.regras.geral.vos.pessoa.ContatoVO;
import br.com.werp.regras.geral.vos.pessoa.DependenteVO;
import br.com.werp.regras.geral.vos.pessoa.DocumentoPessoaVO;
import br.com.werp.regras.geral.vos.pessoa.PessoaBancoVO;
import br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO;
import br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO;
import br.com.werp.regras.geral.vos.tabelas.Dependente;
import br.com.werp.regras.geral.vos.tabelas.Endereco;
import br.com.werp.regras.geral.vos.tabelas.Pessoa;
import br.com.werp.regras.pessoa.controle.ControleBanco;
import br.com.werp.regras.pessoa.controle.ControleContato;
import br.com.werp.regras.pessoa.controle.ControleDependente;
import br.com.werp.regras.pessoa.controle.ControleDocumentoPessoal;
import br.com.werp.regras.pessoa.controle.ControleOrgaoPublico;
import br.com.werp.regras.pessoa.controle.ControlePessoaFisica;
import br.com.werp.regras.pessoa.controle.ControlePessoaJuridica;
import br.com.werp.regras.pessoa.integracao.FabricaDAO;
import br.com.werp.regras.pessoa.integracao.PessoaJuridicaDAO;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;


/**
 * @author Sobreira
 * Criado em 05/01/2005
 *
 */
public class GerenciamentoPessoaImpl implements GerenciamentoPessoa {
    private static GerenciamentoPessoaImpl pessoaImpl;
    private ControlePessoaFisica controlePessoaFisica =
        new ControlePessoaFisica();
    private ControlePessoaJuridica controlePessoaJuridica =
        new ControlePessoaJuridica();
    private ControleContato controleContato = new ControleContato();
    private ControleDependente controleDependete = new ControleDependente();
    private ControleDocumentoPessoal controleDocumentoPessoal =
        new ControleDocumentoPessoal();
    private ControleOrgaoPublico controleOrgaoPublico =
        new ControleOrgaoPublico();
    private ControleBanco controleBanco = new ControleBanco();

    private GerenciamentoPessoaImpl() {
    }

    public static GerenciamentoPessoaImpl getGerenciamentoPessoaImpl() {
        if (pessoaImpl == null) {
            pessoaImpl = new GerenciamentoPessoaImpl();
        }

        return pessoaImpl;
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.Pessoa#inserirPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO)
     */
    public int inserirPessoaFisica(PessoaFisicaVO pessoaFisicaVO, Object conn,
        String usuario) throws ErroPadrao {
        try {
            return controlePessoaFisica.inserirPessoaFisica(pessoaFisicaVO,
                conn, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#inserirPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.String)
     */
    public int inserirPessoaFisica(PessoaFisicaVO pessoaFisicaVO, String usuario)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.inserirPessoaFisica(pessoaFisicaVO,
                usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#atualizarPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.Object, java.lang.String)
     */
    public void atualizarPessoaFisica(PessoaFisicaVO pessoaFisicaVO,
        Object conn, String usuario) throws ErroPadrao {
        try {
            controlePessoaFisica.atualizarPessoaFisica(pessoaFisicaVO, conn,
                usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#atualizarPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.String)
     */
    public void atualizarPessoaFisica(PessoaFisicaVO pessoaFisicaVO,
        String usuario) throws ErroPadrao {
        try {
            controlePessoaFisica.atualizarPessoaFisica(pessoaFisicaVO, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public br.com.werp.regras.geral.vos.tabelas.Contato obterContato(
        String pessoa, String tpContato) throws ErroPadrao {
        try {
            return controleContato.obterContato(pessoa, tpContato);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public Endereco obterEndereco(String contatoId) throws ErroPadrao {
        try {
            return controleContato.obterEndereco(contatoId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void persistirContato(Object key, String userId,
        ContatoVO contatoVO, String op) throws ErroPadrao {
        try {
            controleContato.persistirContato(key, userId, contatoVO, op);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.Object, java.lang.String)
     */
    public List obterPessoasFisica(PessoaFisicaVO pessoaFisicaVO, Object conn)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.obterPessoasFisica(pessoaFisicaVO, conn);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterPessoaFisica(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.String)
     */
    public List obterPessoasFisica(PessoaFisicaVO pessoaFisicaVO)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.obterPessoasFisica(pessoaFisicaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterContatos(java.lang.String)
     */
    public List obterContatos(String pessId) throws ErroPadrao {
        try {
            return controleContato.obterContatos(pessId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public PessoaJuridicaVO obterPessoaJuridica(String pessoaId)
        throws ErroPadrao {
        try {
            return controlePessoaJuridica.obterPessoaJuridica(pessoaId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterPessoaJuridica(PessoaJuridicaVO pessoaJuridicaVO)
        throws ErroPadrao {
        try {
            return controlePessoaJuridica.obterPessoaJuridica(pessoaJuridicaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterPessoaFisica(java.lang.String)
     */
    public PessoaFisicaVO obterPessoaFisica(String pessoaId)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.obterPessoaFisica(pessoaId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#inserirPessoaJuridica(br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO, java.lang.Object, java.lang.String)
     */
    public int inserirPessoaJuridica(PessoaJuridicaVO pessoaJuridicaVO,
        Object conn, String usuario) throws ErroPadrao {
        try {
            return controlePessoaJuridica.inserirPessoaJuridica(pessoaJuridicaVO,
                conn, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#inserirPessoaJuridica(br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO, java.lang.String)
     */
    public int inserirPessoaJuridica(PessoaJuridicaVO pessoaJuridicaVO,
        String usuario) throws ErroPadrao {
        try {
            return controlePessoaJuridica.inserirPessoaJuridica(pessoaJuridicaVO,
                usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#pesquisarPessoaFisicaChave(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
     */
    public List pesquisarPessoaFisicaChave(String nome, String dtNasc,
        String sexo, String cpf) throws ErroPadrao {
        try {
            return controlePessoaFisica.pesquisarPessoaFisicaChave(nome,
                dtNasc, sexo, cpf);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#atualizaPessoaJuridica(java.lang.Object, br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO)
     */
    public void atualizaPessoaJuridica(PessoaJuridicaVO pessoaJuridicaVO,
        Object conn, String usuario) throws ErroPadrao {
        try {
            controlePessoaJuridica.atualizaPessoaJuridica(pessoaJuridicaVO,
                conn, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterDependentesIR(java.lang.String)
     */
    public List obterDependentesIR(String contribuinteId)
        throws ErroPadrao {
        try {
            return controleDependete.obterDependentesIR(contribuinteId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterPessoaFisicaChave(java.lang.String, java.lang.String, java.lang.String)
     */
    public List obterPessoaFisicaChave(String nome, String data_nasc,
        String sexo) throws ErroPadrao {
        try {
            return controlePessoaFisica.obterPessoaFisicaChave(nome, data_nasc,
                sexo);
        } catch (Exception e) {
            Debuger.debugar(e, getClass());

            return new ArrayList();
        }
    }

    /**
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#persistirDocumentosPessoais(java.util.List, java.lang.Object, java.lang.String, int)
     */
    public void persistirDocumentosPessoais(List documentoPessoaVOs,
        Object key, String usuario, int pess_id) throws ErroPadrao {
        try {
            // controleDocumentoPessoal.persistirDocumentosPessoais(key, usuario,
            //   documentoPessoaVOs, pess_id);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /**
     *
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterDocumentosPessoa(java.lang.String)
     */
    public List obterDocumentosPessoa(String pessId) throws ErroPadrao {
        try {
            return controleDocumentoPessoal.obterDocumentoPessoal(pessId);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#inserirDependentesHostorico(java.lang.Object, java.lang.String)
     */
    public void inserirDependentesHistorico(Object form, String usuario)
        throws ErroPadrao {
        try {
            controleDependete.inserirDependentesHistorico(form, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterDependentesHostorico(java.lang.String, java.lang.String)
     */
    public List obterDependentesHistorico(String contribuiinteId,
        String depd_fisica) throws ErroPadrao {
        try {
            return controleDependete.obterDependentesHistorico(contribuiinteId,
                depd_fisica);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#persistirDependentesPessoaFisica(java.util.List, java.lang.String, int, java.lang.String, java.lang.Object)
     */
    public void persistirDependentesPessoaFisica(List dependentes,
        String usuario, int contribuinteId, Object key)
        throws ErroPadrao {
        try {
            controleDependete.persistirDependentesPessoaFisica(dependentes,
                usuario, contribuinteId, key);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#obterDependetes(br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO, java.lang.String)
     */
    public List obterDependetes(PessoaFisicaVO pessoaFisicaVO)
        throws ErroPadrao {
        try {
            return controleDependete.obterDependetes(pessoaFisicaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#persistirDependentesPessoaFisica(java.util.List, java.lang.String, int, java.lang.String)
     */
    public void persistirDependentesPessoaFisica(List dependentes,
        String usuario, int contribuinteId, String operacao)
        throws ErroPadrao {
        try {
            controleDependete.persistirDependentesPessoaFisica(dependentes,
                usuario, contribuinteId, operacao);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public String obterHistoricoTipoPessoaJuridica(Object key, String cnpj)
        throws ErroPadrao {
        try {
            PessoaJuridicaDAO pessoaJuridicaDAO =
                FabricaDAO.getPessoaJuridicaDAO();

            return pessoaJuridicaDAO.obterHistoricoTipoPessoaJuridica(key, cnpj);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public int obterPessIdCpf(Object formCpf) throws Exception {
        try {
            return controlePessoaFisica.obterPessIdCpf(formCpf);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public int obterPessIdCnpj(Object formCnpj) throws Exception {
        try {
            return controlePessoaJuridica.obterPessIdCnpj(formCnpj);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public boolean verificaTipoPessoaFisica(Object key, String cpf, String tipo)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.verificaTipoPessoaFisica(cpf, tipo);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public boolean verificaTipoPessoaJuridica(Object key, String cnpj,
        String tipo) throws ErroPadrao {
        try {
            return controlePessoaJuridica.verificaTipoPessoaJuridica(cnpj, tipo);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#verificaTipoPessoaFisica(java.lang.String, java.lang.String)
     */
    public boolean verificaTipoPessoaFisica(String cpf, String tipo)
        throws ErroPadrao {
        try {
            return controlePessoaFisica.verificaTipoPessoaFisica(cpf, tipo);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#verificaTipoPessoaJuridica(java.lang.String, java.lang.String)
     */
    public boolean verificaTipoPessoaJuridica(String cnpj, String tipo)
        throws ErroPadrao {
        try {
            return controlePessoaJuridica.verificaTipoPessoaJuridica(cnpj, tipo);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    /* (non-Javadoc)
     * @see br.com.werp.regras.geral.GerenciamentoPessoa#excluirPessoaJuridica(br.com.werp.regras.geral.vos.pessoa.PessoaJuridicaVO, java.lang.Object, java.lang.String)
     */
    public void excluirPessoaJuridica(PessoaJuridicaVO pessoaJuridicaVO,
        Object conn, String usuario) throws ErroPadrao {
        try {
            controlePessoaJuridica.excluirPessoaJuridica(pessoaJuridicaVO,
                conn, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterPessoa(Pessoa pessoa) throws ErroPadrao {
        try {
            return PessoaHelper.obterPessoa(pessoa);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void excluirPessoaFisica(Object key, String usuario,
        PessoaFisicaVO pessoaFisicaVO) throws ErroPadrao {
        try {
            controlePessoaFisica.excluirPessoaFisica(key, usuario,
                pessoaFisicaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterPessoasFisica(Object form) throws ErroPadrao {
        try {
            return controlePessoaFisica.obterPessoasFisica(form);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void persistirOrgaoPublico(Object form, String usuario)
        throws ErroPadrao {
        try {
            controleOrgaoPublico.persistirOrgaoPublico(form, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pequisarOrgaoPublico(Object form) throws ErroPadrao {
        try {
            return controleOrgaoPublico.pesquisarOrgaoPublico(form);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void carregarOrgaoPublico(Object form) throws ErroPadrao {
        try {
            controleOrgaoPublico.carregarOrgaoPublico(form);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void excluirOrgaoPublico(Object form, String usuario)
        throws ErroPadrao {
        try {
            controleOrgaoPublico.excluirOrgaoPublico(form, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void persistirBanco(PessoaBancoVO pessoaBancoVO, String usuario)
        throws ErroPadrao {
        try {
            controleBanco.persistirBanco(pessoaBancoVO, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pesquisarBanco(PessoaBancoVO pessoaBancoVO)
        throws ErroPadrao {
        try {
            return controleBanco.pesquisarBanco(pessoaBancoVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void manterListaDocumentos(DocumentoPessoaVO documentoPessoaVO,
        List documentos, String[] listadocumentos, String documentoOp)
        throws ErroPadrao {
        try {
            controleDocumentoPessoal.manterListaDocumentos(documentoPessoaVO,
                documentos, listadocumentos, documentoOp);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void atualizarDocumento(List documentos, int pess_id, Object key,
        String usuario) throws ErroPadrao {
        try {
            controleDocumentoPessoal.atualizarDocumento(documentos, pess_id,
                key, usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void carregarDocumentoPessoal(int pess_id, List documentos_pessoais)
        throws ErroPadrao {
        try {
            controleDocumentoPessoal.carregarDocumentoPessoal(pess_id,
                documentos_pessoais);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public Set verificaTipoPessoaFisica(int pess_id) throws ErroPadrao {
        try {
            return controlePessoaFisica.verificaTipoPessoaFisica(pess_id);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public Set verificaTipoPessaoJuridica(int juri_pessoa)
        throws ErroPadrao {
        try {
            return controlePessoaJuridica.verificaTipoPessoaJuridica(juri_pessoa);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public boolean obterStatusHistoricoDependente(int pess_id)
        throws ErroPadrao {
        try {
            return controleDependete.obterStatusHistoricoDependente(pess_id);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public void inserirDependentesHistoricoVOTablea(Dependente dependente,
        String usuario) throws ErroPadrao {
        try {
            controleDependete.inserirDependentesHistoricoVOTablea(dependente,
                usuario);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterDependentesIR(DependenteVO dependenteVO)
        throws ErroPadrao {
        try {
            return controleDependete.obterDependentesIR(dependenteVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List obterDependenteVO(DependenteVO dependenteVO)
        throws ErroPadrao {
        try {
            return controleDependete.obterDependenteVO(dependenteVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }

    public List pesquisarPessoaFisicaVO(PessoaFisicaVO pessoaFisicaVO)
        throws ErroPadrao {
        try {
            return FabricaDAO.getPessoaFisicaDAO()
                             .obterPessoaFisicaVO(pessoaFisicaVO);
        } catch (Exception e) {
            throw new ErroPadrao(GerenciadorErros.logarErro(e));
        }
    }
}
